package com.xia.demo.reflex;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TargetObject {
    private String value;
    public String name;
    private String age;

    public TargetObject() {
        value = "JavaGuide";
    }

    public void publicMethod(String s) {
        System.out.println("I love " + s);
    }

    private void privateMethod() {
        System.out.println("value is " + value);
    }

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<?> tagetClass = Class.forName("com.xia.demo.reflex.TargetObject");
        TargetObject o = (TargetObject)tagetClass.newInstance();
        System.out.println(o);

        /**
         * 获取所有类中所有定义的方法
         */
        Method[] declaredMethods = tagetClass.getDeclaredMethods();
        Method publicMethod = tagetClass.getDeclaredMethod("publicMethod", String.class);
        publicMethod.invoke(o, "hihihi");

//
//        Field[] fields = tagetClass.getFields();
//        for (Field field : fields) {
//            field.setAccessible(true);
//            // 只能显示public name
//            System.out.println(field.getName());
//        }


        Field[] fs = tagetClass.getDeclaredFields();// 获取所有属性
        for (int i = 0; i < fs.length; i++) {
            fs[i].setAccessible(true);// 将目标属性设置为可以访问
            System.out.println(fs[i].getName());
        }


        Method[] ms = tagetClass.getDeclaredMethods();// 获取获取class对象所有的方法
        for (int i = 0; i < ms.length; i++) {
            ms[i].setAccessible(true);// 将目标属性设置为可以访问
            // 用Eclipse的后端小伙伴请使用System.out.println()打印结果
            System.out.println(ms[i].getName());
        }



    }

}